home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung 2 / Power-Programmierung CD 2 (Tewi)(1994).iso / c / library / dos / diverses / leda / incl / plane.h < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  14.8 KB  |  612 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 11-15-1991
  4. +
  5. +
  6. +  plane.h
  7. +
  8. +
  9. +  Copyright (c) 1991  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15.  
  16.  
  17. #ifndef PLANEH
  18. #define PLANEH
  19.  
  20. #include <LEDA/list.h>
  21. #include <LEDA/vector.h>
  22.  
  23. class point;
  24. class segment;
  25.  
  26. //------------------------------------------------------------------------------
  27. // points
  28. //------------------------------------------------------------------------------
  29.  
  30. class point_rep  {
  31.  
  32. friend class point;
  33. friend class segment_rep;
  34. friend class segment;
  35. friend class line_rep;
  36. friend class line;
  37. friend class circle_rep;
  38. friend class circle;
  39.  
  40. public:
  41.  
  42. double x;
  43. double y;
  44. int  count;
  45.  
  46.  
  47. point_rep();     
  48. point_rep(double a, double b);
  49.  
  50.  
  51. OPERATOR_NEW(5)
  52. OPERATOR_DEL(5)
  53.  
  54. };
  55.  
  56. //------------------------------------------------------------------------------
  57.  
  58. class point   {
  59.  
  60. friend class segment_rep;
  61. friend class segment;
  62. friend class line_rep;
  63. friend class line;
  64. friend class circle_rep;
  65. friend class circle;
  66.  
  67. point_rep* ptr;
  68.  
  69. public:
  70.  
  71. point();
  72. point(double, double);
  73. point(vector);
  74. point(point&);
  75. point(ent);
  76. point(int);
  77. void clear();
  78.  
  79. ~point()                 { clear(); }
  80.  
  81. operator  vector()       { return vector(ptr->x,ptr->y); }
  82.  
  83. double xcoord()  const   { return ptr->x; }
  84. double ycoord()  const   { return ptr->y; }
  85.  
  86. double  distance(point);
  87. double  distance();
  88.  
  89. point   translate(double,double);
  90. point   translate(const vector&);
  91.  
  92. point   rotate(point,double);
  93. point   rotate(double);
  94.  
  95. point& operator=(const point& p);
  96.  
  97. point operator+(vector& v) { return translate(v); }
  98.  
  99. int operator==(const point&);
  100.  
  101. int operator!=(const point& p) { return !operator==(p);}
  102.  
  103. friend ostream& operator<<(ostream& out, const point& p) ;
  104. friend istream& operator>>(istream& in, point& p) ;
  105.  
  106. friend void Print(point& p, ostream& out = cout) { out << p; } 
  107. friend void Read(point& p,  istream& in = cin)   { in >> p; }
  108.  
  109. friend void Clear(point& p) { p.clear(); }
  110. friend ent  Init(point& p)  { p.ptr->count++; return ent(p.ptr); }
  111. friend ent  Copy(const point& p)  { p.ptr->count++; return ent(p.ptr); }
  112.  
  113. friend ent  Ent(const point& p)   { return p.ptr; }
  114.  
  115. friend int compare(point&, point&);
  116.  
  117. };
  118.  
  119. declare(list,point)
  120.  
  121.  
  122. //------------------------------------------------------------------------------
  123. // POINT(cmp): points with user defined linear order cmp
  124. //------------------------------------------------------------------------------
  125.  
  126. #define POINT(cmp) name2(point_,cmp)
  127.  
  128. #define POINTdeclare(cmp)\
  129. struct POINT(cmp) : public point \
  130. {  POINT(cmp)(ent p)               : point(p)   {}\
  131.    POINT(cmp)(int p)               : point(p)   {}\
  132.    POINT(cmp)(point  p )           : point(p)   {}\
  133.    POINT(cmp)(POINT(cmp)& p)       : point(p)   {}\
  134.    POINT(cmp)() {}\
  135.  ~ POINT(cmp)() {}\
  136. };\
  137. \
  138. int compare(POINT(cmp)& x, POINT(cmp)& y) { return cmp(x,y); }
  139.  
  140.  
  141. //------------------------------------------------------------------------------
  142. // segments
  143. //------------------------------------------------------------------------------
  144.  
  145. class segment_rep {
  146.  
  147. friend class segment;
  148. friend class line_rep;
  149. friend class line;
  150. friend class circle_rep;
  151. friend class circle;
  152.  
  153. public:
  154.  
  155. point start;
  156. point end;
  157.  
  158. int count;
  159.  
  160. segment_rep(point p, point q);
  161. segment_rep();  
  162.  
  163.  
  164.  
  165. OPERATOR_NEW(3)
  166. OPERATOR_DEL(3)
  167.  
  168. };
  169.  
  170. //------------------------------------------------------------------------------
  171.  
  172. class segment  {
  173.  
  174. friend class line_rep;
  175. friend class line;
  176. friend class circle_rep;
  177. friend class circle;
  178.  
  179. segment_rep* ptr;
  180.  
  181. public:
  182.  
  183. segment();                 
  184. segment(point x, point y); 
  185. segment(double x1, double y1, double x2, double y2) ;
  186. segment(point p, double length, double alpha);
  187. segment(segment&);      
  188. segment(ent);          
  189. segment(int);          
  190. void clear();           
  191.  
  192. ~segment()                { clear(); }
  193.  
  194.  
  195. operator vector()  { return vector(xcoord2()-xcoord1(), ycoord2()-ycoord1()); }
  196.  
  197. bool intersection(segment s, point& inter);
  198.  
  199. point start()  const      { return ptr->start; }
  200. point end()    const      { return ptr->end; }
  201.  
  202. double xcoord1()             { return ptr->start.ptr->x; }
  203. double xcoord2()             { return ptr->end.ptr->x;   }
  204. double ycoord1()             { return ptr->start.ptr->y; }
  205. double ycoord2()             { return ptr->end.ptr->y;   }
  206.  
  207. segment translate(double,double);
  208. segment translate(const vector&);
  209.  
  210. double  angle(segment);
  211. double  angle();
  212. double  direction()          { return angle();}
  213. double  distance(segment);
  214. double  distance(point);
  215. double  distance();
  216. double  slope();
  217. double  y_abs();
  218. double  length();
  219.  
  220. segment rotate(double);
  221. segment rotate(point,double);
  222.  
  223. bool  vertical();
  224. bool  horizontal();
  225.  
  226. bool  right()             { return ptr->start.ptr->x < ptr->end.ptr->x; }
  227. bool  left()              { return ptr->start.ptr->x > ptr->end.ptr->x; }
  228. bool  up()                { return ptr->start.ptr->y < ptr->end.ptr->y; }
  229. bool  down()              { return ptr->start.ptr->y > ptr->end.ptr->y; }
  230.  
  231. segment& operator=(const segment& s);
  232.  
  233. segment operator+(const vector& v) { return translate(v); }
  234.  
  235. int operator==(const segment& s) 
  236. { return (ptr->start == s.ptr->start && ptr->end == s.ptr->end); }
  237.  
  238. int operator!=(const segment& s) { return !operator==(s);}
  239.  
  240. friend ostream& operator<<(ostream& out, const segment& s);
  241. friend istream& operator>>(istream& in, segment& s);
  242.  
  243. friend void Print(segment& s, ostream& out = cout) { out << s << "<" << s.ptr->count << ">"; } 
  244. friend void Read(segment& s,  istream& in = cin)   { in >> s; }
  245.  
  246. friend void Clear(segment& s) { s.clear(); }
  247. friend ent  Init(segment& s)  { s.ptr->count++; return ent(s.ptr); }
  248. friend ent  Copy(const segment& s)  { s.ptr->count++; return ent(s.ptr); }
  249.  
  250. friend ent  Ent(const segment& p)   { return p.ptr; }
  251.  
  252. };
  253.  
  254. declare(list,segment)
  255.  
  256.  
  257. //------------------------------------------------------------------------------
  258. // SEGMENT(cmp): segments with user defined linear order cmp
  259. //------------------------------------------------------------------------------
  260.  
  261. #define SEGMENT(cmp) name2(segment_,cmp)
  262.  
  263. #define SEGMENTdeclare(cmp)\
  264. struct SEGMENT(cmp) : public point \
  265. {  SEGMENT(cmp)(ent p)               : segment(p)   {}\
  266.    SEGMENT(cmp)(int p)               : segment(p)   {}\
  267.    SEGMENT(cmp)(segment  p )         : segment(p)   {}\
  268.    SEGMENT(cmp)(SEGMENT(cmp)& p)     : segment(p)   {}\
  269.    SEGMENT(cmp)() {}\
  270.  ~ SEGMENT(cmp)() {}\
  271. };\
  272. \
  273. int compare(SEGMENT(cmp)& x, SEGMENT(cmp)& y) { return cmp(x,y); }
  274.  
  275.  
  276. //------------------------------------------------------------------------------
  277. // straight lines
  278. //------------------------------------------------------------------------------
  279.  
  280.  
  281. struct line_rep 
  282. {
  283.   segment  seg; 
  284.   int   count;
  285.  
  286.   line_rep(segment s);
  287.   line_rep();
  288.  
  289.  
  290. OPERATOR_NEW(2)
  291. OPERATOR_DEL(2)
  292.  
  293. };
  294.  
  295.  
  296. //------------------------------------------------------------------------------
  297.  
  298. class line  {
  299.  
  300. line_rep* ptr;
  301.  
  302. public:
  303.  
  304. line();
  305. line(line&);
  306. line(segment);
  307. line(ent);
  308. line(int);
  309. line(point, point);
  310. line(point, double);
  311. void clear();
  312.  
  313. ~line()                { clear(); }
  314.  
  315.  
  316.  
  317. bool intersection(line l, point& inter);
  318. bool intersection(segment s, point& inter);
  319.  
  320. bool vertical()        { return ptr->seg.vertical();  }
  321. bool horizontal()      { return ptr->seg.horizontal();}
  322.  
  323. double distance()        { return ptr->seg.distance();  }
  324. double distance(point p) { return ptr->seg.distance(p); }
  325. double angle(line l)     { return ptr->seg.angle(l.ptr->seg); }
  326. double angle()           { return ptr->seg.angle();     }
  327. double direction()       { return angle();}
  328. double slope()           { return ptr->seg.slope();     }
  329. double y_abs()           { return ptr->seg.y_abs();    }
  330.  
  331. segment perpendicular(point q);
  332.  
  333. line    translate(double alpha, double d) { return ptr->seg.translate(alpha,d); }
  334. line    translate(const vector& v)        { return ptr->seg.translate(v); }
  335.  
  336. line    rotate(point o, double alpha){ return ptr->seg.rotate(o,alpha); }
  337. line    rotate(double alpha)         { return rotate(point(0,0),alpha);}
  338.  
  339. double y_proj(double);
  340. double x_proj(double);
  341.  
  342. bool contains(point);
  343. bool contains(segment);
  344.  
  345. line& operator=(const line& l);
  346.  
  347. line operator+(const vector& v) { return translate(v); }
  348.  
  349. int operator==(const line& l) { return contains(l.ptr->seg); }
  350. int operator!=(const line& l) { return !contains(l.ptr->seg); };
  351.  
  352. friend ostream& operator<<(ostream& out, const line& l);
  353. friend istream& operator>>(istream& in, line& l);  
  354.  
  355. friend void Clear(line& l) { l.clear(); }
  356. friend ent  Init(line& l)  { l.ptr->count++; return ent(l.ptr); }
  357.  
  358. friend void Print(line& l, ostream& out = cout) { out << l; } 
  359. friend void Read(line& l,  istream& in = cin)   { in >> l; }
  360.  
  361. friend ent  Copy(const line& l)  { l.ptr->count++; return ent(l.ptr); }
  362.  
  363. friend ent  Ent(const line& p)   { return p.ptr; }
  364.  
  365. };
  366.  
  367. declare(list,line)
  368.  
  369.  
  370. //------------------------------------------------------------------------------
  371. // LINE(cmp): lines with user defined linear order cmp
  372. //------------------------------------------------------------------------------
  373.  
  374. #define LINE(cmp) name2(line_,cmp)
  375.  
  376. #define LINEdeclare(cmp)\
  377. struct LINE(cmp) : public line \
  378. {  LINE(cmp)(ent p)              : line(p)   {}\
  379.    LINE(cmp)(int p)              : line(p)   {}\
  380.    LINE(cmp)(line  p )           : line(p)   {}\
  381.    LINE(cmp)(LINE(cmp)& p)       : line(p)   {}\
  382.    LINE(cmp)() {}\
  383.  ~ LINE(cmp)() {}\
  384. };\
  385. \
  386. int compare(LINE(cmp)& x, LINE(cmp)& y) { return cmp(x,y); }
  387.  
  388.  
  389. //------------------------------------------------------------------------------
  390. // circles
  391. //------------------------------------------------------------------------------
  392.  
  393. struct circle_rep 
  394. {
  395.   double  radius;  // exchanging radius and center yields a compiler error
  396.   point   center; 
  397.   int     count;
  398.  
  399.   circle_rep(point p, double r);
  400.   circle_rep();
  401.  
  402.  
  403. OPERATOR_NEW(4)
  404. OPERATOR_DEL(4)
  405.  
  406. };
  407.  
  408. //------------------------------------------------------------------------------
  409.  
  410. class circle {
  411.  
  412. circle_rep* ptr;
  413.  
  414. public:
  415.  
  416. circle();
  417. circle(circle& l);
  418. circle(point c, double r);
  419. circle(double x, double y, double r);
  420. circle(ent);
  421. circle(int);
  422. void clear();
  423.  
  424. ~circle()                { clear(); }
  425.  
  426.  
  427. circle& operator=(const circle& C) { ptr = C.ptr; ptr->count++; return *this; }
  428.  
  429. circle operator+(const vector& v) { return translate(v); }
  430.  
  431.  
  432. int operator==(const circle&) ;
  433.  
  434. int operator!=(const circle& c) { return !operator==(c); };
  435.  
  436. point center()    const  { return ptr->center; } 
  437. double  radius()  const  { return ptr->radius; }
  438.  
  439.  
  440. double    distance(point);
  441. double    distance(line);
  442. double    distance(circle);
  443. bool    inside(point);
  444. segment left_tangent(point);
  445. segment right_tangent(point);
  446.  
  447. bool    outside(point p) { return !inside(p); };
  448.  
  449. circle  translate(double,double) ;
  450. circle  translate(const vector&) ; 
  451.  
  452. circle  rotate(point, double);
  453. circle  rotate(double);
  454.  
  455.  
  456. list(point) intersection(circle);
  457. list(point) intersection(line);
  458. list(point) intersection(segment);
  459.  
  460. friend ostream& operator<<(ostream& out, const circle& c);
  461. friend istream& operator>>(istream& in, circle& c);  
  462.  
  463. friend void Clear(circle& c) { c.clear(); }
  464. friend ent  Init(circle& c)  { c.ptr->count++; return ent(c.ptr); }
  465.  
  466. friend void Print(circle& c, ostream& out = cout) { out << c; } 
  467. friend void Read(circle& c,  istream& in = cin)   { in >> c; }
  468.  
  469. friend ent  Copy(const circle& c)  { c.ptr->count++; return ent(c.ptr); }
  470.  
  471. friend ent  Ent(const circle& p)   { return p.ptr; }
  472.  
  473. };
  474.  
  475. declare(list,circle)
  476.  
  477.  
  478. //------------------------------------------------------------------------------
  479. // CIRCLE(cmp): circles with user defined linear order cmp
  480. //------------------------------------------------------------------------------
  481.  
  482. #define CIRCLE(cmp) name2(circle_,cmp)
  483.  
  484. #define CIRCLEdeclare(cmp)\
  485. struct CIRCLE(cmp) : public circle \
  486. {  CIRCLE(cmp)(ent p)               : circle(p)   {}\
  487.    CIRCLE(cmp)(int p)               : circle(p)   {}\
  488.    CIRCLE(cmp)(circle  p )          : circle(p)   {}\
  489.    CIRCLE(cmp)(CIRCLE(cmp)& p)      : circle(p)   {}\
  490.    CIRCLE(cmp)() {}\
  491.  ~ CIRCLE(cmp)() {}\
  492. };\
  493. \
  494. int compare(CIRCLE(cmp)& x, CIRCLE(cmp)& y) { return cmp(x,y); }
  495.  
  496.  
  497. //------------------------------------------------------------------------------
  498. // polygons
  499. //------------------------------------------------------------------------------
  500.  
  501. struct polygon_rep 
  502. {
  503.   list(segment) seg_list;
  504.   int   count;
  505.  
  506.   polygon_rep(list(segment) L);
  507.   polygon_rep();
  508.  
  509.  
  510. OPERATOR_NEW(6)
  511. OPERATOR_DEL(6)
  512.  
  513. };
  514.  
  515.  
  516. //------------------------------------------------------------------------------
  517.  
  518. class list(polygon);
  519.  
  520. class polygon {
  521.  
  522.  
  523. polygon_rep* ptr;
  524.  
  525. bool check();
  526.  
  527. public:
  528.  
  529. polygon();
  530. polygon(list(point)&, bool=true);
  531. polygon(polygon& P);
  532. polygon(ent);
  533. polygon(int);
  534. void clear();
  535.  
  536. ~polygon()                { clear(); }
  537.  
  538.  
  539. list(point)   vertices() const;  
  540. list(segment) segments() const { return ptr->seg_list; }
  541.  
  542. bool          inside  (point p); 
  543. bool          outside (point p); 
  544.  
  545. list(point)   intersection(segment s);
  546. list(point)   intersection(line l);  
  547. list(polygon) intersection(polygon P);
  548.  
  549. polygon       translate(double, double);
  550. polygon       translate(const vector&);
  551.  
  552. polygon       rotate(point, double);
  553. polygon       rotate(double);
  554.  
  555. int         size()                  { return ptr->seg_list.size(); }
  556. bool        empty()                 { return ptr->seg_list.empty(); }
  557.  
  558. polygon& operator=(const polygon& P) { ptr = P.ptr; ptr->count++; return *this; }
  559.  
  560. polygon operator+(const vector& v) { return translate(v); }
  561.  
  562. friend ostream& operator<<(ostream& out, const polygon& p);
  563. friend istream& operator>>(istream& in,  polygon& p);
  564.  
  565. friend void Print(polygon& P, ostream& out = cout){ out << P; } 
  566. friend void Read(polygon& P, istream& in = cin) { in  >> P; }
  567.  
  568. friend void Clear(polygon& P){ P.clear(); }
  569. friend ent  Init(polygon& P) { P.ptr->count++; return ent(P.ptr); }
  570. friend ent  Copy(const polygon& P) { P.ptr->count++; return ent(P.ptr); }
  571.  
  572. friend ent  Ent(const polygon& p)  { return p.ptr; }
  573.  
  574. };
  575.  
  576. declare(list,polygon)
  577.  
  578.  
  579. //------------------------------------------------------------------------------
  580. // POLYGON(cmp): polygons with user defined linear order cmp
  581. //------------------------------------------------------------------------------
  582.  
  583. #define POLYGON(cmp) name2(polygon_,cmp)
  584.  
  585. #define POLYGONdeclare(cmp)\
  586. struct POLYGON(cmp) : public polygon \
  587. {  POLYGON(cmp)(ent p)               : polygon(p)   {}\
  588.    POLYGON(cmp)(int p)               : polygon(p)   {}\
  589.    POLYGON(cmp)(polygon  p )         : polygon(p)   {}\
  590.    POLYGON(cmp)(POLYGON(cmp)& p)     : polygon(p)   {}\
  591.    POLYGON(cmp)() {}\
  592.  ~ POLYGON(cmp)() {}\
  593. };\
  594. \
  595. int compare(POLYGON(cmp)& x, POLYGON(cmp)& y) { return cmp(x,y); }
  596.  
  597.  
  598. //------------------------------------------------------------------------------
  599. // some usefull functions
  600. //------------------------------------------------------------------------------
  601.  
  602. extern bool right_turn(point,point,point);
  603. extern bool left_turn(point,point,point);
  604. extern line p_bisector(point p, point q);
  605.  
  606.  
  607. /* #include <LEDA/plane_alg.h> */
  608.  
  609.  
  610. #endif 
  611.